package main

import (
	"fmt"
	"io"
	"os"
	"path/filepath"

	"github.com/astaxie/beego"
)

// FileController 处理文件上传下载的控制器
type FileController struct {
	beego.Controller
}

// Upload 处理文件上传
func (c *FileController) Upload() {
	// 获取上传的文件
	file, handler, err := c.GetFile("file")
	if err != nil {
		c.Ctx.WriteString("获取文件失败: " + err.Error())
		return
	}
	defer file.Close()

	// 获取共享目录配置
	sharedDir := beego.AppConfig.String("sharedDir")
	if sharedDir == "" {
		sharedDir = "d:/data/" // 默认目录
	}

	// 确保目录存在
	if _, err := os.Stat(sharedDir); os.IsNotExist(err) {
		os.MkdirAll(sharedDir, 0755)
	}

	// 创建目标文件
	f, err := os.OpenFile(filepath.Join(sharedDir, handler.Filename), os.O_WRONLY|os.O_CREATE, 0644)
	if err != nil {
		c.Ctx.WriteString("创建文件失败: " + err.Error())
		return
	}
	defer f.Close()

	// 复制文件内容
	io.Copy(f, file)

	c.Ctx.WriteString("文件上传成功: " + handler.Filename)
}

// ListFiles 列出所有文件
func (c *FileController) ListFiles() {
	sharedDir := beego.AppConfig.String("sharedDir")
	if sharedDir == "" {
		sharedDir = "d:/data/"
	}

	// 读取目录下的所有文件
	files, err := os.ReadDir(sharedDir)
	if err != nil {
		c.Ctx.WriteString("读取目录失败: " + err.Error())
		return
	}

	// 生成HTML列表
	c.Ctx.WriteString(`<html><body><h1>文件列表</h1><ul>`)
	for _, file := range files {
		if !file.IsDir() {
			c.Ctx.WriteString(`<li><a href="/download/` + file.Name() + `">` + file.Name() + `</a></li>`)
		}
	}
	c.Ctx.WriteString(`</ul><h2>上传文件</h2><form method="post" enctype="multipart/form-data" action="/upload">
		<input type="file" name="file">
		<input type="submit" value="上传">
	</form></body></html>`)
}

// Download 处理文件下载
func (c *FileController) Download() {
	filename := c.Ctx.Input.Param(":filename")
	sharedDir := beego.AppConfig.String("sharedDir")
	if sharedDir == "" {
		sharedDir = "d:/data/"
	}

	filePath := filepath.Join(sharedDir, filename)

	// 检查文件是否存在
	if _, err := os.Stat(filePath); os.IsNotExist(err) {
		c.Ctx.WriteString("文件不存在")
		return
	}

	// 设置响应头，触发下载
	c.Ctx.Output.Download(filePath, filename)
}

func main() {
	// 配置路由
	beego.Router("/", &FileController{}, "get:ListFiles")
	beego.Router("/upload", &FileController{}, "post:Upload")
	beego.Router("/download/:filename", &FileController{}, "get:Download")

	// 启动服务器
	port := beego.AppConfig.String("httpport")
	if port == "" {
		port = "8088"
	}
	fmt.Printf("文件共享服务器已启动，访问 http://localhost:%s\n", port)
	fmt.Printf("共享目录为: %s\n", beego.AppConfig.String("sharedDir"))
	beego.Run(":" + port)
}
